﻿Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
Public Class GebaeudeFabrik
    Inherits ObjektGebaeude

    Public Sub New(ByVal neuSpieler As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Spielfeld As ObjektSpielfeld)
        MyBase.New("FABRIK", neuSpieler, neuX, neuY, ObjektSpielfeld.Bodenschlacht)
        GebaeudeLaden()
        getBildID(Spielfeld)
    End Sub
    Public Sub New(ByVal neuSpieler As Integer, ByVal neuLeben As Integer, ByVal neuBesetzungszahl As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Feuerzahl As Integer, ByVal Spielfeld As ObjektSpielfeld)
        MyBase.New("FABRIK", neuSpieler, neuLeben, neuBesetzungszahl, neuX, neuY, Feuerzahl, ObjektSpielfeld.Bodenschlacht)
        GebaeudeLaden()
        getBildID(Spielfeld)
    End Sub
    Public Sub New()
        MyBase.New("", -1, -1, -1, ObjektSpielfeld.Bodenschlacht)
        Gebaeudename = "Fabrik"
        getFonds = False
        Deckung = 0
        Bestzunge = -1
        Schaden = 0
        Reichweite = 0
        Rechteck.Height = Hauptmenue.Feldbreite * 4
        Rechteck.Width = Hauptmenue.Feldbreite * 3
        Angriff = Angriffe.FabrikBauen
        If Spieler = 0 Then
            Leben = -1
        Else
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.CommanderWars2, CommanderWarsGameModi.CommanderWars
                    Leben = 1000
                Case Else
                    Leben = -1
            End Select
        End If
        Feuerbereite = -1
        Feuerladung = -1
        RotationsZenturm = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite * 5 / 2)
        WirdZu = "EBENE+SCHROTT"
        Array.Resize(Variablen, 2)
        Variablen(0) = New Variable("Baufelder", 7)
        Variablen(1) = New Variable("Fabrikfonds", 0)
        Verweisgebaeude = New Integer(,) {{-1, -2}, {0, -2}, {1, -2}, {-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}}
    End Sub

    Private Sub GebaeudeLaden()
        Gebaeudename = "Fabrik"
        getFonds = False
        Deckung = 0
        Bestzunge = -1
        Schaden = 0
        Reichweite = 0
        Rechteck.Height = Hauptmenue.Feldbreite * 4
        Rechteck.Width = Hauptmenue.Feldbreite * 3
        Angriff = Angriffe.FabrikBauen
        If Spieler = 0 Then
            Leben = -1
        Else
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.CommanderWars2, CommanderWarsGameModi.CommanderWars
                    Leben = 1000
                Case Else
                    Leben = -1
            End Select
        End If
        Feuerbereite = -1
        Feuerladung = -1
        RotationsZenturm = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite * 5 / 2)
        WirdZu = "EBENE+SCHROTT"
        Array.Resize(Variablen, 2)
        Variablen(0) = New Variable("Baufelder", 7)
        Variablen(1) = New Variable("Fabrikfonds", 0)
        Verweisgebaeude = New Integer(,) {{-1, -2}, {0, -2}, {1, -2}, {-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}}
        If Rechteck.X > 0 And Rechteck.Y > 1 Then
            For I = 0 To Verweisgebaeude.GetLength(0) - 1
                If Not Objektverwalter.Spielfeld Is Nothing Then
                    Objektverwalter.Spielfeld.Landschaften(Rechteck.X + Verweisgebaeude(I, 0), Rechteck.Y + Verweisgebaeude(I, 1), ObjektSpielfeld.Bodenschlacht).Gebaeude = New GebaeudeVerweis(Spieler, Rechteck.X, Rechteck.Y, ObjektSpielfeld.Bodenschlacht)
                End If
            Next
        End If
    End Sub
    Public Overrides Function GetMaxLeben() As Integer
        Select Case DataSettings.CommanderWarsGameModus
            Case CommanderWarsGameModi.CommanderWars2, CommanderWarsGameModi.CommanderWars
                If Leben > 1000 Then Return Leben
                Return 1000
            Case Else
                If Leben > -1 Then Return Leben
                Return -1
        End Select
    End Function
    Public Overrides Sub Feuer(ByVal X As Integer, ByVal Y As Integer)
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        Dim T As Texture = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Menu Icons\FabrikTor.png")
        Dim Tore As New Stack(Of String)
        Dim TorTexturen As New Stack(Of Texture)
        Select Case M.Spielmodus
            Case ObjektSpielMenue.Spielmodi.Nichts
                Objektverwalter.Spielfeld.AktuelleEinheitPosition = New Point(Rechteck.X, Rechteck.Y)
                If Objektverwalter.Spielfeld.OnMap(Rechteck.X, Rechteck.Y + 2) Then
                    Select Case Variablen(0).Wert
                        Case 0
                        Case 1
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X - 1, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 1")
                                TorTexturen.Push(T)
                            End If
                        Case 2
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 2")
                                TorTexturen.Push(T)
                            End If
                        Case 3
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X - 1, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 1")
                                TorTexturen.Push(T)
                            End If
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 2")
                                TorTexturen.Push(T)
                            End If
                        Case 4
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X + 1, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 3")
                                TorTexturen.Push(T)
                            End If
                        Case 5
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X - 1, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 1")
                                TorTexturen.Push(T)
                            End If
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X + 1, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 3")
                                TorTexturen.Push(T)
                            End If
                        Case 6
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 2")
                                TorTexturen.Push(T)
                            End If
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X + 1, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 3")
                                TorTexturen.Push(T)
                            End If
                        Case 7
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X - 1, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 1")
                                TorTexturen.Push(T)
                            End If
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 2")
                                TorTexturen.Push(T)
                            End If
                            If Objektverwalter.Spielfeld.Einheiten(Rechteck.X + 1, Rechteck.Y + 2, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                                Tore.Push("Tor 3")
                                TorTexturen.Push(T)
                            End If
                    End Select
                End If
                If Tore.Count > 0 Then
                    If (DataSettings.draw3D Or DataSettings._2D_3D_Malen) Then
                        Objektverwalter.EinheitenMenue = New ObjektEinheitenmenue(Tore.ToArray, TorTexturen.ToArray, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                    Else
                        Objektverwalter.EinheitenMenue = New ObjektEinheitenmenue(Tore.ToArray, TorTexturen.ToArray, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Y * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, False, Nothing, False, True, ObjektEinheitenmenue.Modi.Anderes)
                    End If

                Else
                    Objektverwalter.AuswahlMenuerschaffen()
                End If
            Case ObjektSpielMenue.Spielmodi.Tor1Bauen
                Baumenuerstellen(Rechteck.X - 1, Rechteck.Y + 2)
            Case ObjektSpielMenue.Spielmodi.Tor2Bauen
                Baumenuerstellen(Rechteck.X, Rechteck.Y + 2)
            Case ObjektSpielMenue.Spielmodi.Tor3Bauen
                Baumenuerstellen(Rechteck.X + 1, Rechteck.Y + 2)
        End Select
    End Sub
    Public Sub Baumenuerstellen(ByVal X As Integer, ByVal Y As Integer)
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        Dim Symbolen As New Stack(Of Texture)
        Dim Namen As New Stack(Of String)
        Dim SymbolMasken As New Stack(Of Texture)

        If Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
            If Not Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste Is Nothing Then
                For I = 0 To Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Length - 1
                    If KannEinheitplaziertwerden(X, Y, Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I), Objektverwalter.Spielfeld.Regeln.Wetter) = True Then
                        If ObjektLadeklasse.GetEinheitenkosten(Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I)) * Objektverwalter.Spielfeld.AktuellerSpieler.Teurungsrate(Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I), Rechteck.X, Rechteck.Y) <= Variablen(1).Wert Then
                            Dim ID As Integer = 0
                            For I2 = 0 To Objektverwalter.AlleEinheiten.Length - 1
                                If Objektverwalter.AlleEinheiten(I2).EinheitenID = Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I) Then
                                    ID = I2
                                    Exit For
                                End If
                            Next
                            Dim Symbol As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentextur(Objektverwalter.Spielfeld.AktuellerSpieler.Armee)
                            Dim Maske As Texture = Objektverwalter.AlleEinheiten(ID).GetEinheitentexturMaske(Objektverwalter.Spielfeld.AktuellerSpieler.Armee)
                            Namen.Push(ObjektLadeklasse.GetNamefromID(Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I)))
                            Symbolen.Push(Symbol)
                            SymbolMasken.Push(Maske)
                        End If
                    End If
                Next
            Else
                For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                    If KannEinheitplaziertwerden(X, Y, I, Objektverwalter.Spielfeld.Regeln.Wetter) = True Then
                        If ObjektLadeklasse.GetEinheitenkosten(Objektverwalter.AlleEinheiten(I).EinheitenID) * Objektverwalter.Spielfeld.AktuellerSpieler.Teurungsrate(Objektverwalter.AlleEinheiten(I).EinheitenID, Rechteck.X, Rechteck.Y) <= Variablen(1).Wert Then
                            Dim Symbol As Texture = Objektverwalter.AlleEinheiten(I).GetEinheitentextur(Objektverwalter.Spielfeld.AktuellerSpieler.Armee)
                            Dim Maske As Texture = Objektverwalter.AlleEinheiten(I).GetEinheitentexturMaske(Objektverwalter.Spielfeld.AktuellerSpieler.Armee)
                            Namen.Push(ObjektLadeklasse.GetNamefromID(Objektverwalter.AlleEinheiten(I).EinheitenID))
                            Symbolen.Push(Symbol)
                            SymbolMasken.Push(Maske)
                        End If
                    End If
                Next
            End If
        End If
        If Namen.Count > 0 Then
            If (DataSettings.draw3D Or DataSettings._2D_3D_Malen) Then
                Objektverwalter.EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, True, Nothing, True, False, ObjektEinheitenmenue.Modi.Einheitbauen, SymbolMasken.ToArray)
            Else
                Objektverwalter.EinheitenMenue = New ObjektEinheitenmenue(Namen.ToArray, Symbolen.ToArray, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, Hauptmenue.Feldbreite, X * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Y * Hauptmenue.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY, True, Nothing, True, False, ObjektEinheitenmenue.Modi.Einheitbauen, SymbolMasken.ToArray)
            End If
        Else
            M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
            If Objektverwalter.EinheitenMenue IsNot Nothing Then
                Hauptmenue.CursorPlazieren(Objektverwalter.EinheitenMenue.Feldpunkt.X * Hauptmenue.Feldbreite, Objektverwalter.EinheitenMenue.Feldpunkt.Y * Hauptmenue.Feldbreite)
                Objektverwalter.EinheitenMenue.Dispose()
                Objektverwalter.EinheitenMenue = Nothing
            End If
            ObjektMaus.Visible = True
        End If
    End Sub
    Public Shared Function KannEinheitplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal ID As String, ByVal Wetter As ObjektSpielfeld.Wetterarten) As Boolean
        Dim Stelle As Integer
        For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
            If Objektverwalter.AlleEinheiten(I).EinheitenID = ID Then
                Stelle = I
                Exit For
            End If
        Next
        If Objektverwalter.Bewegungskosten(Objektverwalter.AlleEinheiten(Stelle).Einheit.Bewegungsart, Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID, Wetter) > 0 Then
            Return True
        End If
        Return False
    End Function
    Public Shared Function KannEinheitplaziertwerden(ByVal X As Integer, ByVal Y As Integer, ByVal ID As Integer, ByVal Wetter As ObjektSpielfeld.Wetterarten) As Boolean
        If Objektverwalter.Bewegungskosten(Objektverwalter.AlleEinheiten(ID).Einheit.Bewegungsart, Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).getID, Wetter) > 0 Then
            Return True
        End If
        Return False
    End Function
    Public Sub Bauen(ByVal Einheitenname As String, ByVal X As Integer, ByVal Y As Integer, Optional ByVal OhneMusik As Boolean = False)
        Dim EinheitID As String = ObjektLadeklasse.GetIDFromName(Einheitenname)

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Hauptmenue.User.UnitBuild(EinheitID)
        End If

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As New KINetzwerkBefehl
            Befehl.Befehl = ObjektKI.KIModiExtern.FabrikBauen
            Befehl.KooX = X
            Befehl.KooY = Y
            Dim ID As Integer = -1
            For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                If Objektverwalter.AlleEinheiten(I).EinheitenID = EinheitID Then
                    ID = I
                    Exit For
                End If
            Next
            Befehl.WegX = New Integer() {ID}
            Befehl.WegY = New Integer() {False}
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenue.NetzBefehlSenden(Befehl)
        End If

        Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht) = ObjektLadeklasse.NewEinheit(EinheitID, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, X, Y, False)
        Variablen(1).Wert = Variablen(1).Wert - ObjektLadeklasse.GetEinheitenkosten(EinheitID) * Objektverwalter.Spielfeld.AktuellerSpieler.Teurungsrate(EinheitID, Rechteck.X, Rechteck.Y)
        Objektverwalter.Spielfeld.Regeln.SindBesiegbar()
        If OhneMusik = False Then
            MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\OK.wav", False)
        End If
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        Hauptmenue.CursorPlazieren(X * Hauptmenue.Feldbreite, Y * Hauptmenue.Feldbreite)

        'Wir haben noch eine Truppe gemacht
        Objektverwalter.Spielfeld.Aufzeichnung.DeployedUnits(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler - 1) += 1
        Objektverwalter.Spielfeld.Regeln.CheckSieg()
    End Sub
    Public Overrides Sub FeuerradiusAnzeigen()
        'Do Nothing
    End Sub
    Public Overrides Sub DOSpielFrame()
        Variablen(0).Wert = 7
        Variablen(1).Wert = Variablen(1).Wert + Objektverwalter.Spielfeld.AktuellerSpieler.Fabrikfonds
    End Sub
    Public Overrides Function GetLandschaftsuntergrund() As String()
        Return New String() {"EBENE", "SCHNEE", "WUESTE", "EBENE+SCHROTT"}
    End Function
    Public Function GetBauEinheiten(ByVal X As Integer, ByVal Y As Integer) As String()
        Dim Namen As String() = {}
        If Objektverwalter.Spielfeld.OnMap(X, Y) = True Then
            If Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                If Not Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste Is Nothing Then
                    For I = 0 To Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Length - 1
                        If KannEinheitplaziertwerden(X, Y, Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I), Objektverwalter.Spielfeld.Regeln.Wetter) = True Then
                            If ObjektLadeklasse.GetEinheitenkosten(Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I)) * Objektverwalter.Spielfeld.AktuellerSpieler.Teurungsrate(Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I), X, Y) <= Variablen(1).Wert Then
                                Array.Resize(Namen, Namen.Length + 1)
                                Namen(Namen.Length - 1) = Objektverwalter.Spielfeld.AktuellerSpieler.GetBauliste.Beschreibung(I)
                            End If
                        End If
                    Next
                Else
                    For I = 0 To Objektverwalter.AlleEinheiten.Length - 1
                        If KannEinheitplaziertwerden(X, Y, I, Objektverwalter.Spielfeld.Regeln.Wetter) = True Then
                            If ObjektLadeklasse.GetEinheitenkosten(Objektverwalter.AlleEinheiten(I).EinheitenID) * Objektverwalter.Spielfeld.AktuellerSpieler.Teurungsrate(Objektverwalter.AlleEinheiten(I).EinheitenID, X, Y) <= Variablen(1).Wert Then
                                Array.Resize(Namen, Namen.Length + 1)
                                Namen(Namen.Length - 1) = Objektverwalter.AlleEinheiten(I).EinheitenID
                            End If
                        End If
                    Next
                End If
            End If
        End If
        Return Namen
    End Function
    Public Overrides Function GetAngriffsFelder() As System.Drawing.Point()
        Return New Point() {}
    End Function
End Class

